home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Extravaganza - Disc 1
/
ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso
/
grprogs
/
picutil.exe
/
ALTER.SRC
/
SUB.ASM
< prev
Wrap
Assembly Source File
|
1986-06-25
|
9KB
|
240 lines
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ PROGRAM = SUB.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
CSEG SEGMENT PUBLIC BYTE
ASSUME CS:CSEG,DS:CSEG
INCLUDE PUBLICS.EQU
EXTRN BUFF_SIZE:WORD
EXTRN DISK_BUFFER:DWORD
EXTRN HANDLE_IN:WORD
EXTRN HANDLE_OUT:WORD
EXTRN FLAGS:WORD
DIVISOR DW 0,1
TEN DW 10,100,1000,10000
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ ASCII TO BINARY ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ DS:SI = START OF ASCII STRING │
;│ AX = NUMBER OF CHARACTER IN STRING (1-5) │
;├─────────────────────────────────────────────────────────────────────────────┤
;│ AX = RETURNS BINARY NUMBER │
;└─────────────────────────────────────────────────────────────────────────────┘
PUBLIC ASC2BIN
ASC2BIN PROC NEAR
PUSH BX ;SAVE REGISTERS
PUSH CX ;
PUSH DX ;
PUSH SI ;
SHL AX,1 ;MAKE INTO WORD OFFSET
MOV BX,AX ;
PUSH SI ;
MOV SI,OFFSET DIVISOR ;
MOV CX,[SI+BX] ;DIVISOR
POP SI ;
XOR BX,BX ;CLEAR BINARY HOLD REGISTER
;
ASC100: ;
LODSB ;GET ASCII NUMBER
AND AL,0FH ;STRIP ASCII PART
XOR AH,AH ;
MUL CX ;
ADD BX,AX ;
CMP CX,1 ;DONE?
JE ASC300
MOV AX,CX ;GET DIVISOR
XOR DX,DX ;
DIV TEN ;DIVIDE IT BY TEN
MOV CX,AX ;PUT BACK IN DX
JMP SHORT ASC100 ;
ASC300:
MOV AX,BX ;PUT BINARY NUMBER IN AX
POP SI ;RESTORE REGISTERS
POP DX ;
POP CX ;
POP BX ;
RET
ASC2BIN ENDP
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ BINARY TO ASCII ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ AX = BINARY NUMBER │
;│ BX = NUMBER OF ASCII CHARACTERS TO FILL (1-5) │
;│ ES:DI = WHERE TO PUT ASCII STRING │
;└─────────────────────────────────────────────────────────────────────────────┘
PUBLIC BIN2ASC
BIN2ASC PROC NEAR
PUSH AX ;SAVE REGISTERS
PUSH BX ;
PUSH CX ;
PUSH DX ;
PUSH DI ;
PUSH SI ;
PUSH ES
SHL BX,1 ;MAKE INTO WORD OFFSET
MOV SI,OFFSET DIVISOR ;
MOV CX,[SI+BX] ;DIVISOR
BIN100: ;
XOR DX,DX ;CLEAR DX FOR DIVIDE
DIV CX ;
ADD AL,'0' ;
STOSB ;
CMP CX,1 ;
JE BIN300 ;
PUSH DX ;SAVE REMAINDER
MOV AX,CX ;GET DIVISOR
XOR DX,DX ;
DIV TEN ;DIVIDE IT BY TEN
MOV CX,AX ;PUT BACK IN DX
POP AX ;GET REMAINDER IN AX
JMP SHORT BIN100 ;
BIN300:
POP ES
POP SI ;RESTORE REGISTERS
POP DI ;
POP DX ;
POP CX ;
POP BX ;
POP AX ;
RET
BIN2ASC ENDP
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ WRITE_DATA ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ CX = BYTE COUNT │
;│ BX = HANDLE OF FILE │
;└─────────────────────────────────────────────────────────────────────────────┘
PUBLIC WRITE_DATA
WRITE_DATA PROC NEAR
PUSH DS
LDS DX,CS:DISK_BUFFER
MOV AH,40H
INT 21H
POP DS
RET
WRITE_DATA ENDP
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ READ_DATA ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ CX = BYTE COUNT │
;│ BX = HANDLE OF FILE │
;└─────────────────────────────────────────────────────────────────────────────┘
PUBLIC READ_DATA
READ_DATA PROC NEAR
PUSH DS
MOV AH,3FH
LDS DX,CS:DISK_BUFFER
INT 21H
POP DS
RET
READ_DATA ENDP
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ READ_RAW ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ READ [BUFF_SIZE] BYTES INTO DISK_BUFFER │
;│ ON RETURN AX CONTAINS NUMBER OF BYTES READ │
;│ AND CARRY WILL BE SET IF THIS IS END OF FILE │
;└─────────────────────────────────────────────────────────────────────────────┘
PUBLIC READ_RAW
READ_RAW PROC NEAR
PUSH BX
PUSH CX
PUSH DX
MR100:
MOV BX,CS:HANDLE_IN ;
MOV CX,BUFF_SIZE ;
CALL READ_DATA ;READ 8000H BYTES
CMP AX,BUFF_SIZE ;DONE?
JE MR300 ;NO..
MR200:
STC
JMP SHORT MR400
MR300:
CLC
MR400:
PUSHF
TEST FLAGS,INVERT_IN
JZ MR500
CALL INVERT_BUFF
MR500:
POPF
POP DX
POP CX
POP BX
RET
READ_RAW ENDP
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ WRITE_RAW ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
;┌─────────────────────────────────────────────────────────────────────────────┐
;│ AX = NUMBER OF BYTES TO WRITE │
;│ COPIES DATA FROM DISK_BUFFER TO DISK │
;└─────────────────────────────────────────────────────────────────────────────┘
PUBLIC WRITE_RAW
WRITE_RAW PROC NEAR
PUSH AX ;SAVE REGISTERS
PUSH BX ;
PUSH CX ;
PUSH DX ;
TEST FLAGS,INVERT_OUT
JZ WR100
CALL INVERT_BUFF
WR100:
MOV CX,AX ;NUMBER OF BYTES TO WRITE
MOV BX,CS:HANDLE_OUT ;
CALL WRITE_DATA ;WRITE IN
CLC
POP DX ;RESTORE REGISTERS
POP CX ;
POP BX ;
POP AX ;
RET
WRITE_RAW ENDP
;╔═════════════════════════════════════════════════════════════════════════════╗
;║ ░░░░░░░░░░░ INVERT BUFFER ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
;╚═════════════════════════════════════════════════════════════════════════════╝
INVERT_BUFF PROC NEAR
PUSH CX
PUSH DI
PUSH ES
MOV CX,4000H
LES DI,CS:DISK_BUFFER
IB100:
NOT WORD PTR ES:[DI]
INC DI
INC DI
LOOP IB100
POP ES
POP DI
POP CX
RET
INVERT_BUFF ENDP
;╔═════════════════════════════════════════════════════════════════════════════╗
;╚═════════════════════════════════════════════════════════════════════════════╝
CSEG ENDS
END